﻿using dotnet_ef_admin.Src.Models;
using dotnet_ef_admin.Src.Services;
using dotnet_ef_admin.Src.Utilities;
using Microsoft.AspNetCore.Mvc;

namespace dotnet_ef_admin.Src.Controllers;

/// <summary>
///     角色控制器，处理与角色相关的API请求。
/// </summary>
[Route("/api/v1/[controller]")]
[ApiController]
public class RoleController(IRoleService roleService) : ControllerBase {
    // /// <summary>
    // /// 角色服务接口的私有只读字段。
    // /// </summary>
    private readonly IRoleService _roleService = roleService;

    /// <summary>
    ///     创建新角色。
    /// </summary>
    /// <param name="role">要创建的新角色对象。</param>
    /// <returns>创建后的角色对象。</returns>
    [HttpPost]
    public async Task<ActionResult<Role>> Create(Role role) {
        var newRole = await _roleService.CreateAsync(role);
        return Ok(newRole);
    }

    /// <summary>
    ///     获取所有角色列表。
    /// </summary>
    /// <returns>所有角色的集合。</returns>
    [HttpGet("page")]
    public async Task<ActionResult<GetAllRolesResult>> FindAll([FromQuery] GetAllRolesRequest request) {
        var roles = await _roleService.FindAllAsync(request);
        return Ok(roles);
    }

    /// <summary>
    ///     更新角色信息。
    /// </summary>
    /// <param name="id">角色的唯一标识符。</param>
    /// <param name="role">包含更新信息的角色对象。</param>
    /// <returns>更新后的角色对象。</returns>
    [HttpPut("{id}")]
    public async Task<ActionResult<Role>> Update(int id, Role role) {
        if (id != role.Id) return BadRequest();

        var updatedRole = await _roleService.UpdateAsync(role);
        return Ok(updatedRole);
    }

    /// <summary>
    ///     根据ID批量删除角色。
    /// </summary>
    /// <param name="ids">要删除的角色ID，多个ID用逗号分隔。</param>
    /// <returns>删除成功时返回200 OK响应和成功消息。</returns>
    [HttpDelete("{ids}")]
    public async Task<IActionResult> DeleteMany([FromRoute] string ids) {
        // 将传入的字符串ids（比如"2,3"）转换为整数数组
        var idArray = ids.Split(',').Select(int.Parse).ToArray();

        await _roleService.DeleteManyAsync(idArray);

        return Ok("删除成功");
    }

    /// <summary>
    ///     使用HttpGet请求获取特定角色的表单信息。
    /// </summary>
    /// <param name="id">角色的唯一标识符。</param>
    /// <returns>一个异步操作，返回包含角色信息的ActionResult对象。</returns>
    [HttpGet("{id}/form")]
    public async Task<ActionResult<Role>> FindForm(int id) {
        // 调用角色服务来异步查找表单信息
        var role = await _roleService.FindFormAsync(id);
        // 返回找到的角色信息，表示请求成功
        return Ok(role);
    }

    /// <summary>
    ///     获取特定角色的菜单ID列表。
    /// </summary>
    /// <param name="id">角色的唯一标识符。</param>
    /// <returns>一个异步操作，返回包含该角色所拥有的所有菜单ID的ActionResult&lt;List&lt;int&gt;&gt;。</returns>
    [HttpGet("{id}/menuIds")]
    public async Task<ActionResult<List<int>>> FindMenus(int id) {
        return await _roleService.FindMenusAsync(id);
    }

    /// <summary>
    ///     更新特定角色的菜单ID列表。
    /// </summary>
    /// <param name="id">角色的唯一标识符。</param>
    /// <param name="data">包含要更新的菜单ID的列表。</param>
    /// <returns>一个异步操作，返回包含成功消息的ActionResult。</returns>
    [HttpPut("{id}/menus")]
    public async Task<ActionResult> UpdateMenus(int id, [FromBody] List<int> data) {
        await _roleService.UpdateMenusAsync(id, data);
        return Ok("修改成功");
    }

    /// <summary>
    ///     获取角色的选项列表。
    /// </summary>
    /// <returns>
    ///     一个异步操作，返回包含<see cref="TransformedItem" />对象的列表，
    ///     该列表表示了所有角色的选项。
    /// </returns>
    [HttpGet("options")]
    public async Task<ActionResult<List<TransformedItem>>> FindOptions() {
        var options = await _roleService.FindOptionsAsync();
        return Ok(options);
    }
}